package com.showsu.editor.utils;


import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class AESUtil {
    private static final String AES_ALGORITHM = "AES";
    // AES加密模式为CBC，填充方式为PKCS5Padding
    private static final String AES_TRANSFORMATION = "AES/CBC/PKCS5Padding";
    // AES密钥为16位
    private static final String AES_KEY = "tlqxfsKKKkFRQGnV";
    // AES初始化向量为16位
    private static final String AES_IV = "NFqD5A3bpu3DTMEY";



    /**
     * AES加密
     *
     * @param data 待加密的数据
     * @return 加密后的数据，使用Base64编码
     */
    public static String encrypt(String data) throws Exception {
        if(data==null){
            return null;
        }
        // 将AES密钥转换为SecretKeySpec对象
        SecretKeySpec secretKeySpec = new SecretKeySpec(AES_KEY.getBytes(), AES_ALGORITHM);
        // 将AES初始化向量转换为IvParameterSpec对象
        IvParameterSpec ivParameterSpec = new IvParameterSpec(AES_IV.getBytes());
        // 根据加密算法获取加密器
        Cipher cipher = Cipher.getInstance(AES_TRANSFORMATION);
        // 初始化加密器，设置加密模式、密钥和初始化向量
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
        // 加密数据
        byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
        // 对加密后的数据使用Base64编码
        return Base64.getEncoder().encodeToString(encryptedData);
    }

    /**
     * AES解密
     *
     * @param encryptedData 加密后的数据，使用Base64编码
     * @return 解密后的数据
     */
    public static String decrypt(String encryptedData) throws Exception {
        // 将AES密钥转换为SecretKeySpec对象
        SecretKeySpec secretKeySpec = new SecretKeySpec(AES_KEY.getBytes(), AES_ALGORITHM);
        // 将AES初始化向量转换为IvParameterSpec对象
        IvParameterSpec ivParameterSpec = new IvParameterSpec(AES_IV.getBytes());
        // 根据加密算法获取解密器
        Cipher cipher = Cipher.getInstance(AES_TRANSFORMATION);
        // 初始化解密器，设置解密模式、密钥和初始化向量
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
        // 对加密后的数据使用Base64解码
        byte[] decodedData = Base64.getDecoder().decode(encryptedData);
        // 解密数据
        byte[] decryptedData = cipher.doFinal(decodedData);
        // 返回解密后的数据
        return new String(decryptedData, StandardCharsets.UTF_8);
    }

    public static void main(String[] args) throws Exception {
        String data = "为发11撒地方撒地方请更换内容含有严重违规内容，请更换内容含有严重违规内容，请更换内容 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊我们攻击乌克兰含有严重违规内容 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊，请更换内容含有严重违规内容，请更换内容含有严重违规内容，请更换内容含有严重违规内容，请更换内容 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊我们攻击乌克兰含有严重违规内容 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊，请更换内容含有严重违规内容，请更换内容含有严重违规内容，请更换内容含有严重违规内容，请更换内容 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊我们攻击乌克兰含有严重违规内容 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊，请更换内容含有严重违规内容，请更换内容含有严重违规内容，请更换内容含有严重违规内容，请更换内容 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊我们攻击乌克兰含有严重违规内容 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊，请更换内容含有严重违规内容，请更换内容含有严重违规内容，请更换内容含有严重违规内容，请更换内容 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊我们攻击乌克兰含有严重违规内容 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊，请更换内容含有严重违规内容，请更换内容含有严重违规内容，请更换内容含有严重违规内容，请更换内容 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊我们攻击乌克兰含有严重违规内容 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊 互相裸露 互裸朋友 裸聊，请更换内容含有严重违规内容，请更换内容含";

        String encryptedData = encrypt(data);
        System.out.println("Encrypted Data: " + encryptedData);

        String decryptedData = decrypt(encryptedData);
        System.out.println("Decrypted Data: " + decryptedData);
    }


}
